/*********************************************************************\
*
*                  (c) lkc
*                  All Rights Reserved. lkc Confidential
*
\*********************************************************************/
/*********************************************************************\
*   Title                      :
*
*   Module Description         :
*
*   Author                     : lkc
*
*   Created                    : 2018-7-24
*
\*********************************************************************/

#include "Communicate.h"
#include "ProtocolPC.h"
#include "ProtocolHuaNuo.h"
#include "ProtocolPodXinWang.h"
#include "SerialPortPosix.h"
#include "UDPSockPosix.h"

std::map<int, ProtocolBasePosix*> protocolMap;

bool CommInitPosix()
{
    //MCU通信设置
#ifdef MCU_IS_ALIVE
#ifndef MCU_COMM_TYPE_IS_QT
//    static SerialPortPosix commMCU(DEV_NAME_MCU);
    std::shared_ptr<SerialPortPosix> commMCU = std::make_shared<SerialPortPosix>(DEV_NAME_MCU);

    if(!commMCU->Open())
    {
        return false;
    }
    if(!commMCU->SetOpt(B19200,0,8,1,'N'))
    {
        printf("Set Port failed\n");
        return false;
    }
    ProtocolMCU::GetInstance().SetCommTool(commMCU);
    protocolMap[commMCU->GetFd()] = &ProtocolMCU::GetInstance();
    ProtocolMCU::GetInstance().CycleSendThread();
#endif//#ifndef MCU_COMM_TYPE_IS_QT
#endif//#ifdef MCU_IS_ALIVE

    //PC通信设置
#ifdef PC_IS_ALIVE
#ifndef PC_COMM_TYPE_IS_QT
    std::shared_ptr<UDPSockPosix> commPC = std::make_shared<UDPSockPosix>(NET_PORT_PC);
    if(!commPC->Open())
    {
        return false;
    }
    ProtocolPC::GetInstance().SetCommTool(commPC);
    protocolMap[commPC->GetFd()] = &ProtocolPC::GetInstance();
    ProtocolPC::GetInstance().CycleSendThread();
#endif //#ifndef PC_COMM_TYPE_IS_QT
#endif //#ifdef PC_IS_ALIVE


    //华诺通信设置
#ifndef HUANUO_COMM_TYPE_IS_QT
    //普通指针new了之后必须delete，否则产生野指针。或者也可用static变量的形式。智能指针可以避免这种情况。
    std::shared_ptr<SerialPortPosix> commHuaNuo = std::make_shared<SerialPortPosix>(DEV_NAME_HUANUO);
    if(!commHuaNuo->Open()) //打开串口，返回文件描述符,华诺通信串口
    {
        return false;
    }
    if(!commHuaNuo->SetOpt(B115200,0,8,1,'E'))
    {
        printf("Set Port failed\n");
        return false;
    }
    ProtocolHuaNuo::GetInstance().SetCommTool(commHuaNuo);
    protocolMap[commHuaNuo->GetFd()] = &ProtocolHuaNuo::GetInstance();
    ProtocolHuaNuo::GetInstance().CycleSendThread();
#endif//#ifndef POD_COMM_TYPE_IS_QT

    //星网智控通信设置
#ifndef POD_XINWANG_COMM_TYPE_IS_QT
    //普通指针new了之后必须delete，否则产生野指针。或者也可用static变量的形式。智能指针可以避免这种情况。
    std::shared_ptr<SerialPortPosix> commPodXinWang = std::make_shared<SerialPortPosix>(DEV_NAME_POD_XINWANG);
    if(!commPodXinWang->Open()) //打开串口，返回文件描述符,华诺通信串口
    {
        return false;
    }
    if(!commPodXinWang->SetOpt(B115200,0,8,1,'N'))
    {
        printf("Set Port failed\n");
        return false;
    }
    ProtocolPodXinWang::GetInstance().SetCommTool(commPodXinWang);
    protocolMap[commPodXinWang->GetFd()] = &ProtocolPodXinWang::GetInstance();
//    ProtocolPodXinWang::GetInstance().CycleSendThread();
#endif//#ifndef POD_COMM_TYPE_IS_QT


    return true;
}

/********************************************************************\
 *
 * REVISION RECORDS
 *
\*********************************************************************/
/*********************************************************************/
/*
 *
 *
 *
\*********************************************************************/
/*------------------------------The End------------------------------*/
